Fork me on GitHub

持续集成 + 自动化部署 [代码流水线管理及 Jenkins 和 gitlab 集成]

一、代码流水线管理

  Pipeline 名词顾名思义就是流水线的意思,因为公司可能会有很多项目。如果使用 jenkins 构建完成后,开发构建项目需要一项一项点击,比较麻烦。所以出现 pipeline 名词。
  代码质量检查完毕之后,我们需要将代码部署到测试环境上去,进行自动化测试

新建部署代码项目

点击新建

这里只需要写一下描述

执行 Shell 脚本

温馨提示:执行命令主要涉及的是权限问题,我们要搞明白,jenkins 是以什么权限来执行命令的。那么问题来了,我们现在 192.168.56.11 上,如果在想 192.168.56.12 上执行命令。需要怎么做呢?

我们做无秘钥有 2 种分案:

1、使用 jenkins 用户将秘钥分发给 192.168.56.12 上

2、使用 root 用户将秘钥分发给 192.168.56.12 上,如果使用 root 用户还要进行 visudo 授权。因为 Web 上默认执行命令的用户是 jenkins

1. 我们使用 root 做密码验证

这里我们的 key 已经做好,如果没做可以直接 ssh-keygen -t ras 来生成秘钥
我们将 192.168.56.11 上的公钥复制到 192.168.56.12 上

[root@linux-node1 ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQChVQufrGwqP5dkzIU4ZwXCjRuSvMVGN5lJdvL/QFckmlVphWMsQw06VsPhgcI1NDjGbKOh5pbjrylyJUCig5YIJ1xuMOZ2YAK32SceMxnVhEb/G4wNb9VMsGQ/Vs4CxrU1HdATktH9zDAV4Qz81x2POYJW5B5LAvwZ4owqnIpZ7o3ya6xBxEvCIMSVtD17oKrNqAphsg+e68KvRexiNCEbCbRGGq3bKevgiDsWpSGnCYsJC0+cSrUxuzEO3G6AqGI/qR3nOeg91rOsoAP3FpFjBKgb/sXggkwwjmGIqFXJrUG+XmczeF4kG/rUrNbdy84e5RyHoIS3XKnJuRjTxHyD root@linux-node1
[root@linux-node2 ~]# vim .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQChVQufrGwqP5dkzIU4ZwXCjRuSvMVGN5lJdvL/QFckmlVphWMsQw06VsPhgcI1NDjGbKOh5pbjrylyJUCig5YIJ1xuMOZ2YAK32SceMxnVhEb/G4wNb9VMsGQ/Vs4CxrU1HdATktH9zDAV4Qz81x2POYJW5B5LAvwZ4owqnIpZ7o3ya6xBxEvCIMSVtD17oKrNqAphsg+e68KvRexiNCEbCbRGGq3bKevgiDsWpSGnCYsJC0+cSrUxuzEO3G6AqGI/qR3nOeg91rOsoAP3FpFjBKgb/sXggkwwjmGIqFXJrUG+XmczeF4kG/rUrNbdy84e5RyHoIS3XKnJuRjTxHyD root@linux-node1
[root@linux-node1 ~]# ssh 192.168.56.12
The authenticity of host '192.168.56.12 (192.168.56.12)' can't be established.
ECDSA key fingerprint is b5:74:8f:f1:03:2d:cb:7d:01:28:30:12:34:9c:35:8c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.56.12' (ECDSA) to the list of known hosts.
Last login: Sat Dec 17 02:14:31 2016 from 192.168.56.1
[root@linux-node2 ~]# ll
total 4
-rw-------. 1 root root 1021 Dec 13 05:56 anaconda-ks.cfg
#现在 SSH 连接就不需要密码了
授权 jenkins 用户,使用 visudo 或者编辑配置文件 /etc/sudoers
[root@linux-node1 ~]# vim /etc/sudoers
 92 jenkins ALL=(ALL)   NOPASSWD:/usr/bin/ssh
#jenkins 授权所有主机,不需要密码执行 ssh。切记不要授权 ALL

我们在 192.168.56.12 上写一个简单 shell 脚本,检测是否可以执行成功。正式环境可以写一个自动化部署的脚本

[root@linux-node2 ~]# echo "echo "hello word"" >demo.sh
[root@linux-node2 ~]# chmod +x demo.sh
[root@linux-node2 ~]# ll demo.sh
-rwxr-xr-x 1 root root 16 Dec 17 02:24 demo.sh

jenkins 编写执行脚本

然后我们点击立即构建

成功!

现在我们要将代码质量管理和测试部署连接起来。

这时候就用到了 git 钩子
我们需要安装 jenkins 插件parameterized

我们选择demo-deploy

再次点击项目设置的时候就会出现Trigger parameterized build on other projects

提示 Projects to build 是为构建设置一个项目。例如我们想构建完代码项目后执行测试的,这里就填写测试的就可以。

最后点击保存,点击构建。我们查看效果

这样我们每次点击 demo-deploy 它就会在构建完成之后在对auto-deploy 进行构建

下载 pipeline。这样只需要构建一个项目,就会帮我们完成所有相关项目
搜索插件 pipeline

等待安装完成

我们点击首页 + 号,新建一个试图

点击 OK

pipeline 配置

然后我们点击保存

pipeline 视图如下

点击 Run

这样就先代码质量进行管理,然后就开始部署了

构建成功后:

这样我们下次想看 pipeline 视图的时候,点击上面的 demo-pipeline 即可

二、Jenkins + gitlab 集成

Jenkins + gitlab 集成后,实现的功能是 开发写好代码提交至 gitlab 上,当时开始 push 到 gitlab 上之后,jenkins 自动帮我们立即构建

这个项目我们需要安装一个 gitlab 钩子 的脚本

提示: jenkins 不论想实现什么功能,都需要安装插件!!

安装完插件之后我们就开始配置钩子脚本

这里需要我们在服务器里面写一个令牌,在 jenkins 上也写一个令牌。这两个可以连接到一起就可以。

# 因为用到了令牌我们还需要在安装一个插件,否则将无法使用。因为令牌是需要登录之后才会有,所以需要有一个管理的插件

插件搜索:Build Aut

为了令牌的安全性,我们使用 openssl 生成一个

[root@linux-node1 ~]# openssl rand -hex 10
0a37c6d7ba1fe3472e26

然后我们点击保存即可

因为 jenkins 上也提示我们需要在 gitlab 上添加钩子脚本

点击我们创建的项目

选中 Webhooks

Build Authorization Token Root Plugin 插件使用说明
https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

使用 Build 插件后,url 如下:

http://192.168.56.11:8080/buildByToken/build?job=auto-deploy&token=0a37c6d7ba1fe3472e26
auto-deploy= 项目名称(构建时的项目名称)
0a37c6d7ba1fe3472e26=jenkins 填写的令牌

然后点击Add Webhook

下方就会出现我们这个选项,我们点击 Test 进行测试

测试结果

向 git 服务器提交代码,验证是否可以自动部署:

[root@linux-node1 ~]# echo "Build Token Root Plugin" > index.html
[root@linux-node1 ~]# git add index.html [root@saltmaster ~/weather]# git commit -m "text"
[root@linux-node1 ~]# git push origin master

jenkins 服务器的日志记录:

[root@linux-node1 ~]# tail -f /var/log/jenkins/jenkins.log

jenkins 项目构建:

访问 web 界面验证代码是否最新的:
jenkins 控制台输出信息:

转自:持续集成 + 自动化部署[代码流水线管理及 Jenkins 和 gitlab 集成]

赞赏是最好的支持与鼓励!
-------------本文结束感谢您的阅读-------------